Vertex ML Metadata
Vertex AI Pipelines でぽんぽか作ったやつを検索して使う
ベースになっているのは TensorFlow の MLMD
MLメタデータ  |  TFX  |  TensorFlow
Using Vertex ML Metadata with Pipelines
システム スキーマの例 - システム スキーマ  |  Vertex AI  |  Google Cloud
Artifact が基底? Dataset と Model がデフォルトで提供されている派生型的な
取得
aiplatform.Artifact.get_with_uri(...) で URI フィールドが一致するものがあれば返る
同じ URI のものが複数存在することはないの?
ある、新しい方が返る(とドキュメントにも書いてた)
作成
create - Class Artifact (1.54.1)  |  Python client library  |  Google Cloud
使いそうなフィールドに限定するとこのあたりだろうか
code:create.py
create(
schema_title: str,
*,
resource_id: typing.Optionalstr = None,
uri: typing.Optionalstr = None,
display_name: typing.Optionalstr = None,
description: typing.Optionalstr = None,
metadata: typing.Optionaltyping.Dict = None,
state: google.cloud.aiplatform_v1.types.artifact.Artifact.State = State.LIVE,
) -> google.cloud.aiplatform.metadata.artifact.Artifact
schema_title は system.Artifact, system.Dataset, system.Model, system.HTML など
get_or_create は resource_id を引数に取るので使い所がわからない
特定の BQ Table を使う時に無ければ登録するとか?
適当な値を projects/.../.../.../metadataStores/default/artifacts/... に指定しても作れるわけではない
Kubeflow Pipelines から作る時は kfp.Artifact やその派生を返す
kfp.dsl - KFP SDK API Reference
filter
Vertex ML Metadata を分析する  |  Vertex AI  |  Google Cloud
code:filter.py
from google.cloud import aiplatform
aiplatform.init(project=project, location=location)
artifacts = aiplatform.Artifact.list(
filter='metadata.model.string_value="large-v3" AND display_name="transcribed"',
order_by='CREATE_TIME desc',
)
from pprint import pprint
for a in artifacts:
pprint(a.name)
pprint(a.display_name)
pprint(a.metadata)
list で帰ってくるのはこのインスタンス
Class Artifact (1.54.1)  |  Python client library  |  Google Cloud
文字列はワイルドカード使える
metadata.source.string_value = "*foo.mkv"'
order_by に使えるのは CREATE_TIME, LAST_UPDATE_TIME, ID
desc, asc も使える、小文字のみ
order_by='CREATE_TIME desc'
pipeline から探す
アーティファクト、実行、コンテキストのクエリ - Vertex ML Metadata を分析する  |  Vertex AI  |  Google Cloud
pipeline を実行すると対応する context が生成されているので、その context から探す
pipeline だろう、と思って Execution やら Experiment から引こうと思ってもうまくいかない
Execution はパイプライン中のステップで、粒度が違う
特定のステップの直下や直上を引くのには使えるが、パイプライン中で生成されたやつ、の粒度の指定に使うものではない(これムズくない?)
code:search_by_context.py
import google.cloud.aiplatform
pipeline = aiplatform.Context.get('pipeline-20240711150000') # 実行名で Context を引く
artifacts = aiplatform.Artifact.list(filter=f'in_context("{pipeline.resource_name}")')
experiment から探す
pipeline を submit する時に experiment を指定する
job.submit(service_account="...", experiment="compare-foo-bar")
名前で experimentを探す
experiment = aiplatform.Experiment.get('compare-foo-bar')
df で取るなら aiplatform.get_experiment_df('compare-foo-bar')
run_name から Execution 引ける
なんか引くのムズかった
Vertex ML Metadata#6667aa9b384461000069867c これ分かるまでの話
多分一発で artifact を引く方法はない?
いろいろやっても引けない...
Artifact のフィールド自体には親とかない、Execution 側にある
aiplatform.Context.list なら with_execution で Context 見つかる
aplatform.Artifact.list で with_execution しても見つからん
直上の ContainerExecution の id を渡すと見つかる
わかったかも!!!
aiplatform.Artifact.list(filter=f'in_context("...")') で PipelineRun の Context をしていする
aiplatform.Context.get(pipeline_run_name) で Context 取れる
TODO これって pipeline で設定する experiment 関係ない? → そう
Vertex ML Metadata を分析する  |  Vertex AI  |  Google Cloud
in_context は context から Artifact, Execution を引ける
parent_contexts, child_contexts が使えるのは Context 対してのみ?